home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / PowerLisp 1.01 / Library / cl.lisp < prev    next >
Encoding:
Text File  |  1993-08-30  |  16.6 KB  |  668 lines  |  [TEXT/ROSA]

  1. ;
  2. ;        Copyright © 1993 Roger Corman. All rights reserved.
  3. ;
  4.  
  5. ;
  6. ;        Lisp standard functions and macros to be loaded at startup.
  7. ;
  8.  
  9. (in-package "COMMON-LISP")
  10. (export '(    if 
  11.             when 
  12.             unless 
  13.             prog1 
  14.             prog2
  15.             loop 
  16.             assert
  17.             warn
  18.             push 
  19.             pushnew
  20.             pop 
  21.             ecase
  22.             incf 
  23.             decf 
  24.             multiple-value-list 
  25.             multiple-value-setq
  26.             multiple-value-bind
  27.             functionp
  28.             position
  29.             find
  30.             svref array-rank-limit array-dimension-limit array-total-size-limit
  31.             read-from-string
  32.             read-function dump-hash-table printcolumn spaces
  33.             print-function prompt *prompt* show-lisp-symbols disassemble
  34.             print-addr
  35.             print-code
  36.             proclaim
  37.             copyright
  38.             require
  39.             provide
  40.             defasm
  41.             hex
  42.             compile
  43.             compile-file
  44.             compile-without-assembling
  45.             identity
  46.             finish-output force-output clear-output
  47.             *features*
  48.             *modules*
  49.             *load-verbose*
  50.             *load-print*
  51.             *gc-verbose*
  52.             *lisp-file-extension*
  53.             *lisp-compiled-file-extension*
  54.             *library-directory*
  55.             *top-level*
  56.             pi
  57.             internal-time-units-per-second
  58.             time))
  59.             
  60. (setq *print-case* :downcase)    ; can be :upcase, :downcase or :capitalize
  61.  
  62. ; Some Common Lisp special variables
  63. (defvar *features* nil)
  64. (defvar *modules* nil)
  65. (defvar *read-suppress* nil)
  66. (defvar *top-level* nil)
  67.  
  68. ;
  69. ;    The *library-directory* special variable is used by
  70. ;    the 'require' function to figure out where to load 
  71. ;    requested modules from.
  72. ;
  73. (defconstant *library-directory* ":library:") 
  74. (defconstant *lisp-file-extension* ".lisp")
  75. (defconstant *lisp-compiled-file-extension* ".compiled-lisp")
  76.  
  77. (defun compile (name &optional definition)
  78.     (require :compiler)
  79.     (compiler::compile name definition))
  80.  
  81. (defun compile-file (input-file &key (output-file "untitled.compiled-lisp") print)
  82.     "Usage: (COMPILE-FILE input-filename :OUTPUT-FILE output-filename)"
  83.     (require :compiler)
  84.     (editor-message (format nil "Compiling file ~A…" input-file))
  85.     (compiler::compile-file input-file output-file print))
  86.  
  87. (defun compile-without-assembling (name &optional definition)
  88.     (require :compiler)
  89.     (compiler::compile-without-assembling name definition))
  90.  
  91. ;
  92. ;    Common Lisp 'prog1' macro
  93. ;
  94. (defmacro prog1 (first-x &rest rest-x) 
  95.     `(let* ((a1 ,first-x)) 
  96.         ,@rest-x
  97.         a1))
  98.  
  99. ;
  100. ;    Common Lisp 'prog2' macro
  101. ;
  102. (defmacro prog2 (first-x second-x &rest rest-x) 
  103.     `(let* ((a1 ,first-x) (a2 ,second-x)) 
  104.         ,@rest-x
  105.         a2))
  106.  
  107. ;
  108. ;    Simple version of LOOP macro
  109. ;
  110. (defmacro loop (&rest forms)
  111.     (dolist (f forms)
  112.         (if (symbolp f)        ;; need expanded macro    
  113.             (progn
  114.                 (require :loop)
  115.                 (return-from loop `(loop ,@forms)))))
  116.     (let ((sym (gensym)))
  117.         `(block nil (tagbody ,sym ,@forms (go ,sym)))))
  118.  
  119. ;
  120. ;    Common Lisp 'assert' macro
  121. ;
  122. (defmacro assert (x) 
  123.     `(if (null ,x) (error "Assertion failed")))
  124.  
  125. ;
  126. ;    Common Lisp 'warn' function.
  127. ;    This should really go to error-output stream.
  128. ;
  129. (defun warn (format-string &rest args)
  130.     (format t "~%Warning: ")
  131.     (apply #'format t format-string args)
  132.     (format t "~%"))
  133.  
  134. ;
  135. ;    Common Lisp 'proclaim' function.
  136. ;    These are currently ignored.
  137. ;
  138. (defun proclaim (decl)
  139.     nil)
  140.  
  141. ;
  142. ;    Common Lisp 'require' function.
  143. ;    The path-name option is not implemented yet.
  144. ;
  145. (defun require (module-name &optional path-name)
  146.     (if path-name
  147.         (progn
  148.             (format t "require: path-name option not implemented~%")
  149.             (format t "Searching default directory: ~A~%"
  150.                 *library-directory*)))
  151.                 
  152.     (if (symbolp module-name)
  153.         (setq module-name (symbol-name module-name)))
  154.  
  155.     ;; load the module if necessary
  156.     (if (not (member module-name *modules* :test #'equal))
  157.         (let ((filename (concatenate 'string *library-directory* 
  158.                     module-name *lisp-file-extension*))
  159.               (compiled-filename (concatenate 'string *library-directory* 
  160.                       module-name *lisp-compiled-file-extension*)))
  161.             (cond
  162.                 ((probe-file compiled-filename)
  163.                  (load compiled-filename))
  164.                 ((probe-file filename)
  165.                  (load filename))
  166.                 (t (error "Can't locate the required module: ~A~%" module-name)))))
  167.  
  168.     ;; if it still doesn't exist, signal an error
  169.     (if (not (member module-name *modules* :test #'equal))
  170.         (error "Could not provide the required module: ~A~%" module-name))
  171.     
  172.     module-name)
  173.         
  174. ;
  175. ;    Common Lisp 'provide' function.
  176. ;
  177. (defun provide (module-name)
  178.     (if (symbolp module-name)
  179.         (setq module-name (symbol-name module-name)))
  180.     (push module-name *modules*)
  181.     module-name)
  182.         
  183. ;
  184. ;
  185. ;    Common Lisp 'incf' macro
  186. ;    This currently does not completely conform to the standard because
  187. ;    subexpressions are evaluated twice.
  188. ;
  189. (defmacro incf (place &optional (delta 1)) 
  190.     `(setf ,place (+ ,place ,delta)))
  191.  ;(defmacro incf ((place-func &optional expr) &optional (delta 1)) 
  192. ;(defmacro incf ((place-func &optional expr) &optional (delta 1)) 
  193. ;    (let ((sym (gensym)))
  194. ;        `(let ((,sym ,expr)) (setf ,(list place-func sym) (+ ,(list place-func sym) ,delta)))))
  195.  ;
  196. ;
  197. ;    Common Lisp 'decf' macro
  198. ;    This currently does not completely conform to the standard because
  199. ;    subexpressions are evaluated twice.
  200. ;
  201. (defmacro decf (place &optional (delta 1)) 
  202.     `(setf ,place (- ,place ,delta)))
  203.  
  204. ;
  205. ;    Common Lisp 'push' macro
  206. ;    This currently does not completely conform to the standard because
  207. ;    subexpressions are evaluated twice.
  208. ;
  209. (defmacro push (val stack)
  210.     (let ((item val) (place stack))
  211.         `(setf ,place (cons ,item ,place))))
  212.  
  213. ;
  214. ;    Common Lisp 'pushnew' macro
  215. ;    This currently does not completely conform to the standard because
  216. ;    subexpressions are evaluated twice.
  217. ;
  218. (defmacro pushnew (item place &key test test-not key)
  219.     `(setf ,place (adjoin ,item ,place)))
  220.  
  221. ;
  222. ;    Common Lisp 'multiple-value-list' macro
  223. ;
  224. (defmacro multiple-value-list (form)
  225.     `(multiple-value-call #'list ,form))
  226.  
  227. ;
  228. ;    Common Lisp 'multiple-value-setq' macro
  229. ;
  230. (defmacro multiple-value-setq (varlist form)
  231.     (let ((setq-forms nil) 
  232.           (value-list-sym (gensym)) 
  233.           (return-form-sym (gensym)))
  234.         (do ((v varlist (cdr v)) (count 0 (1+ count)))
  235.             ((null v))
  236.             (push 
  237.                 `(setq ,(car v) (nth ,count ,value-list-sym)) 
  238.                 setq-forms))
  239.         `(let* ((,value-list-sym (multiple-value-list ,form))
  240.                 (,return-form-sym (car ,value-list-sym)))
  241.             ,@(reverse setq-forms)
  242.             ,return-form-sym)))
  243.  
  244. ;
  245. ;    Common Lisp 'multiple-value-bind' macro
  246. ;
  247. (defmacro multiple-value-bind (vars value-form &rest forms)
  248.     (let ((sym (gensym)))
  249.         `(let ,vars 
  250.             (multiple-value-setq ,vars ,value-form)
  251.             ,@forms)))
  252.  
  253. ;
  254. ;    Common Lisp 'pop' macro
  255. ;    This currently does not completely conform to the standard because
  256. ;    subexpressions are evaluated twice.
  257. ;
  258. (defmacro pop (stack)
  259.     (let ((place stack))
  260.         `(prog1 (car ,place) (setf ,place (cdr ,place)))))
  261.  
  262. ;
  263. ;    Common Lisp 'ecase' macro.
  264. ;
  265. (defmacro ecase (key &rest clauses)
  266.     `(case ,key ,@clauses (otherwise (error "No matching key found in ecase form."))))
  267.  
  268. ;
  269. ;    Set up the reader macro which allows for #| ... |# type comments
  270. ;
  271. (set-dispatch-macro-character #\# #\| 
  272.     #'(lambda (stream char int)
  273.             (do ((c (read-char stream) (read-char stream)))
  274.                  ((and (char= c #\|) (char= (peek-char nil stream) #\#))
  275.                          (read-char stream)(values)) nil)))
  276.  
  277. ;
  278. ;    Set up the reader macro which allows for #+ conditional reads
  279. ;
  280. (set-dispatch-macro-character #\# #\+ 
  281.     #'(lambda (stream char int)
  282.         (let ((feature (read stream)))
  283.             (if (and (symbolp feature) (member feature *features*))
  284.                 (return (read stream)))
  285.  
  286.             ; else need to skip over the next expression
  287.             (let ((*read-suppress* t)))
  288.                 (read stream))
  289.             (return (values))))
  290.  
  291. ;
  292. ;    Set up reader macro for octal, binary and hex numbers
  293. ;    #onnn -> octal, #bnnn ->binary, #xnnn ->hex
  294. ;
  295. (set-dispatch-macro-character #\# #\O 
  296.     #'(lambda (stream char int)
  297.         (let ((*read-base* 8)) 
  298.             (read stream))))
  299.  
  300. (set-dispatch-macro-character #\# #\B 
  301.     #'(lambda (stream char int)
  302.         (let ((*read-base* 2)) 
  303.             (read stream))))
  304.  
  305. (set-dispatch-macro-character #\# #\X 
  306.     #'(lambda (stream char int)
  307.         (let ((*read-base* 16))
  308.             (read stream))))
  309.  
  310. ;
  311. ;    SETF expansion functions
  312. ;
  313. (defmacro defsetf (sym func)
  314.     `(putprop ',sym '_setf_expansion_ ',func))
  315.  
  316. (defsetf symbol-value set)
  317. (defsetf symbol-function $set-symbol-function)
  318. (defsetf macro-function $set-macro-function)
  319. (defsetf documentation put-documentation)
  320. (defun %setcar (c x) (rplaca c x) x)
  321. (defsetf car %setcar)
  322. (defun %setcdr (c x) (rplacd c x) x)
  323. (defsetf cdr %setcdr)
  324. (defsetf rest %setcdr)
  325. (defun %setcaar (x val) (setf (car (car x)) val))
  326. (defsetf caar %setcaar)
  327. (defun %setcadr (x val) (setf (car (cdr x)) val))
  328. (defsetf cadr %setcadr)
  329. (defun %setcdar (x val) (setf (cdr (car x)) val))
  330. (defsetf cdar %setcdar)
  331. (defun %setcddr (x val) (setf (cdr (cdr x)) val))
  332. (defsetf cddr %setcddr)
  333. (defsetf elt setelt)
  334. (defsetf aref _set-aref)
  335. (defun svref (vec index) (elt vec index))
  336. (defun _setsvref (vec index val) (setelt vec index val))
  337. (defsetf svref _setsvref) 
  338. (defsetf get putprop)
  339. (defsetf gethash addhash)
  340. (defsetf fill-pointer _set_fill_pointer)
  341. (defun %setfirst (s x) (setelt s 0 x))
  342. (defsetf first %setfirst)
  343. (defun %setsecond (s x) (setelt s 1 x))
  344. (defsetf second %setsecond)
  345. (defun %setthird (s x) (setelt s 2 x))
  346. (defsetf third %setthird)
  347. (defun %setfourth (s x) (setelt s 3 x))
  348. (defsetf fourth %setfourth)
  349. (defun %setfifth (s x) (setelt s 4 x))
  350. (defsetf fifth %setfifth)
  351. (defun %setsixth (s x) (setelt s 5 x))
  352. (defsetf sixth %setsixth)
  353. (defun %setseventh (s x) (setelt s 6 x))
  354. (defsetf seventh %setseventh)
  355. (defun %seteighth (s x) (setelt s 7 x))
  356. (defsetf eighth %seteighth)
  357. (defun %setninth (s x) (setelt s 8 x))
  358. (defsetf ninth %setninth)
  359. (defun %settenth (s x) (setelt s 9 x))
  360. (defsetf tenth %settenth)
  361.  
  362. ;
  363. ;    constants for Common Lisp
  364. (defconstant array-rank-limit 8)
  365. (defconstant array-dimension-limit 2147483647)
  366. (defconstant array-total-size-limit 2147483647) 
  367. (defconstant internal-time-units-per-second 1000000)
  368. (defconstant pi 3.14159265358979323846)
  369.  
  370. (defvar *load-verbose* nil) 
  371. (defvar *load-print* nil)
  372.  
  373. (defun %is-binary (input-stream)
  374.     (let ((x (read-byte input-stream)))
  375.         (file-position input-stream 0)
  376.         (return (= x 0))))
  377.         
  378. (defun load (filename 
  379.         &key (verbose *load-verbose*) 
  380.              (print *load-print*) 
  381.              if-does-not-exist)
  382.     (editor-message (format nil "Loading file ~A…" filename))
  383.     (let*
  384.         ((loaded 0)
  385.          (stream nil)
  386.          (binary nil)
  387.          (*package* *package*)            ;; bind these to themselves
  388.          (*readtable* *readtable*)
  389.          (*standard-output* *standard-output*))
  390.          
  391.         (if (symbolp filename)
  392.             (setq filename (symbol-name filename)))
  393.         (if (not (stringp filename))
  394.             (error "Invalid file name"))
  395.         
  396.         (setq stream (open filename))
  397.         (setq binary (%is-binary stream))
  398.  
  399.         (if binary 
  400.             (progn
  401.                 (if verbose
  402.                     (progn
  403.                         (format t ";;~%")
  404.                         (format t ";; Loading compiled file: ~A~%" filename)
  405.                         (format t ";;~%")))
  406.         
  407.                 (do* ((expr t))
  408.                     ((null expr)(close stream)(return-from load loaded))
  409.                     (setq expr (%read-code-from-stream stream))
  410.                     (if expr
  411.                         (progn
  412.                             (setq expr (funcall expr))
  413.                             (if print (print expr))
  414.                             (incf loaded))))))
  415.  
  416.         (if verbose
  417.             (progn
  418.                 (format t ";;~%")
  419.                 (format t ";; Loading file: ~A~%" filename)
  420.                 (format t ";;~%")))
  421.         
  422.         (do* ((expr nil))
  423.             ((eq expr 'Eof)(close stream)(return-from load loaded))
  424.             (setq expr (read stream nil))
  425.             (if (not (eq expr 'Eof))
  426.                 (progn
  427.                     (setq expr (eval expr))
  428.                     (if print (print expr))
  429.                     (incf loaded))))))
  430.             
  431. ;;
  432. ;;    Common Lisp 'defun' macro.
  433. ;;    This redefines the built-in special form.
  434. ;;
  435. (defmacro defun (name lambda-list &rest forms)
  436.     (let ((doc-form nil) (lambda-form nil))
  437.         (if (and (typep (car forms) 'string)
  438.                 (cdr forms))
  439.             (progn
  440.                 (setq doc-form 
  441.                     `((setf (documentation ',name 'function) ,(car forms))))
  442.                 (setq forms (cdr forms))))
  443.  
  444.         (setq lambda-form 
  445.             `(lambda ,lambda-list 
  446.                 (block ,name ,@forms)))         
  447.         `(progn
  448.             ,@doc-form
  449.             (setf (symbol-function ',name) (function ,lambda-form))
  450.             (null-environment (function ,name))
  451.             ',name))) 
  452.  
  453. ;;
  454. ;;    Common Lisp 'defmacro' macro.
  455. ;;    This redefines the built-in special form.
  456. ;;
  457. (defmacro defmacro (name lambda-list &rest forms)
  458.     (let ((doc-form nil) (lambda-form nil))
  459.         (if (and (typep (car forms) 'string) (cdr forms))
  460.             (progn
  461.                 (setq doc-form 
  462.                     `((setf (documentation ',name 'macro) ,(car forms))))
  463.                 (setq forms (cdr forms))))
  464.  
  465.         (setq lambda-form 
  466.             `(lambda (form &optional env) 
  467.                 (destructuring-bind ,lambda-list 
  468.                     (cdr form) 
  469.                     (block ,name ,@forms)))) 
  470.         `(progn
  471.             ,@doc-form
  472.             (setf (macro-function ',name) (function ,lambda-form))
  473.             (null-environment (macro-function ',name))
  474.             ',name))) 
  475.  
  476. ;
  477. ;    Common Lisp 'time' macro.
  478. ;
  479. ;
  480. (defmacro time (x)
  481.     `(let ((tm (get-internal-run-time)) ret)
  482.         (setq ret ,x)
  483.         (setq tm (- (get-internal-run-time) tm))
  484.         (decf tm (%elapsed-time nil))    ;; subtract timer overhead
  485.         (setq tm (/ (float tm) 1000000.0))
  486.         (format *trace-output* "Execution time: ~A seconds~%" tm)
  487.         ret))        
  488.  
  489. ; This private macro '%elapsed-time' acts like time, but returns the
  490. ; time elapsed after evaluating the passed expression.
  491. ;
  492. (defmacro %elapsed-time (x)
  493.     `(let ((tm (get-internal-run-time)) ret)
  494.         (setq ret ,x)
  495.         (setq tm (- (get-internal-run-time) tm))
  496.         tm))        
  497.         
  498. ;
  499. ;    Common Lisp 'functionp' function.
  500. ;
  501. (defun functionp (x) (typep x 'function))
  502.  
  503. ;
  504. ;    Common Lisp 'position' function.
  505. ;    To do:     Add :test-not option.
  506. ;
  507. (defun position (item sequence 
  508.         &key from-end (test #'eql) test-not (start 0) end key)
  509.     (unless (integerp end) (setq end (length sequence)))
  510.     (unless (typep sequence 'sequence) (error "Not a sequence"))
  511.     (if test-not (error ":test-not key not implemented"))
  512.     (if from-end
  513.         ;; loop backward
  514.         (do ((i (1- end) (- i 1)))
  515.                 ((< i start) nil)
  516.                 (if (apply test (list (elt sequence i) item))
  517.                     (return i)))
  518.  
  519.         ;;; else go forward
  520.         (do ((i start (+ i 1)))
  521.                 ((>= i end) nil)
  522.                 (if (apply test (list (elt sequence i) item))
  523.                     (return i)))))
  524.  
  525. ;
  526. ;    Common Lisp 'find' function.
  527. ;    To do:     Add :test-not option.
  528. ;
  529. (defun find (item sequence 
  530.         &key from-end (test #'eql) test-not (start 0) end key)
  531.     (unless (integerp end) (setq end (length sequence)))
  532.     (unless (typep sequence 'sequence) (error "Not a sequence"))
  533.     (if test-not (error ":test-not key not implemented"))
  534.     (if from-end
  535.         ;; loop backward
  536.         (do ((i (1- end) (- i 1)) (x))
  537.                 ((< i start) nil)
  538.                 (setq x (elt sequence i))
  539.                 (if (apply test (list x item))
  540.                     (return x)))
  541.  
  542.         ;;; else go forward
  543.         (do ((i start (+ i 1)) (x))
  544.                 ((>= i end) nil)
  545.                 (setq x (elt sequence i))
  546.                 (if (apply test (list x item))
  547.                     (return x)))))
  548.  
  549. ;
  550. ;    Common Lisp 'read-from-string' function.
  551. ;    To do: handle eof-error, eof-value, preserve-whitespace settings    
  552. ;
  553. (defun read-from-string (string &optional eof-error eof-value 
  554.             &key (start 0) end preserve-whitespace 
  555.             &aux string-stream expr position)
  556.     (if (not (typep string 'string)) (error "Not a string"))
  557.     (if (not end) (setq end (length string)))
  558.     (setq string-stream (make-string-input-stream string start end))
  559.     (setq expr (read string-stream))
  560.     (setq position (file-position string-stream))
  561.     (if (eq position 'Eof) (setq position (- end start)))
  562.     (values expr position))    
  563.  
  564. ;;
  565. ;;    Normal top level user input function.
  566. ;;    This will get executed at startup and for the duration of an
  567. ;;    interactive session.
  568. ;;    By default, this function is the value of the variable *top-level*.
  569. ;;
  570. (defun top-level ()
  571.     (do (expr)
  572.         (nil)
  573.         (catch 'common-lisp::%error
  574.             (progn
  575.                 (setq expr (read))
  576.                 (if (eq expr 'quit)
  577.                     (return))
  578.                 (if (eq expr 'Eof)
  579.                     (return 'Eof))
  580.                 (editor-message "Thinking…")    ;; display status message
  581.                 (setq expr (multiple-value-list (eval expr)))
  582.                 (format t "~A~{ ~A~}~%" (car expr) (cdr expr))))))
  583.  
  584. (setq *top-level* #'common-lisp::top-level)
  585.  
  586. ;
  587. ;    Common Lisp 'identity' function.
  588. ;
  589. (defun identity (object) object)
  590.  
  591. (defun finish-output (&optional (stream *standard-output*)) 
  592.     (file-flush stream))
  593.  
  594. (defun force-output (&optional (stream *standard-output*)) 
  595.     (file-flush stream))
  596.  
  597. (defun clear-output (&optional (stream *standard-output*)) 
  598.     (file-flush stream))
  599.  
  600. ;
  601. ;    This allows the #{ (assembly code) } syntax
  602. ;
  603. (set-dispatch-macro-character #\# #\{ 
  604.     #'(lambda (stream char int)
  605.         (require :assembler)
  606.         (let ((*package* (find-package :assembler))) 
  607.             (assemble (read-delimited-list #\} stream) nil))))
  608.  
  609. (defun defasm (&rest x)
  610.     (error "Assembler package not loaded"))
  611.  
  612. (defun hex (x)
  613.     (let ((*print-base* 16))
  614.         (write x))
  615.     (values))
  616.  
  617. (defun printcolumn (s)
  618.     (dolist (x s) (print x)))
  619.  
  620. (defun disassemble (a) 
  621.     (let ((*print-base* 16)) 
  622.         (printcolumn (disassembly-list a))))
  623.  
  624. (defun prompt () 
  625.     (let ((savep *print-escape*))
  626.         (setq *print-escape* nil)
  627.         (write "free: ") 
  628.         (write (free)) 
  629.         (write ">") 
  630.         (write "\n")
  631.         (setq *print-escape* savep)))
  632.  
  633. ;; Print an executable address in hex
  634. (defun print-code (x)
  635.     (let ((*print-base* 16))
  636.         (print (exec-address x))))
  637.  
  638. ;; Print an object address in hex
  639. (defun print-addr (x)
  640.     (let ((*print-base* 16))
  641.         (print (address x))))
  642.         
  643. (defun gc-hook-default-function (nodes-freed)
  644.     (if *gc-verbose*
  645.         (progn
  646.             (format t "Garbage collection: ~A nodes were freed.~%" nodes-freed)
  647.             (file-flush))))
  648.  
  649. (defvar *gc-hook* #'gc-hook-default-function)
  650. (defvar *gc-verbose* nil)        ;; set this to T to get garbage collection messages
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.